package ar.uade.distribuidas.tpo.dba.dominio;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import ar.uade.distribuidas.tpo.base.dominiodto.CondicionDeVentaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.PoliticaDTO;

import com.google.common.collect.Lists;


@Entity
@Table(name="condicionesDeVenta")
public class CondicionDeVenta {  
	
	@Id
	private int id; 
	@ManyToOne
	@JoinColumn(name = "medioPago_id")
	private  MedioPago mediopago;
	@ManyToMany (cascade=CascadeType.ALL) 
    @JoinTable(name="condicionesVenta_politicas",joinColumns=@JoinColumn(name="id_condicion"),
inverseJoinColumns=@JoinColumn(name="id_politica"))

	private List<Politica> politicas;
	
	public CondicionDeVenta(int id, MedioPago medioPago, List<Politica> politicas){
		
		this.id =id;
		this.mediopago = medioPago;
		this.politicas = politicas;
	}
	
	public CondicionDeVenta(int id, MedioPago medioPago){
		
		this.id =id;
		this.mediopago = medioPago;
		this.politicas = new LinkedList<Politica>();
		
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public MedioPago getMediopago() {
		return mediopago;
	}
	public void setMediopago(MedioPago mediopago) {
		this.mediopago = mediopago;
	}
	
	
	
	public List<Politica> getPoliticas() {
		return politicas;
	}

	public void setPoliticas(List<Politica> politicas) {
		this.politicas = politicas;
	}

	public float calcularPorcentajeTotal(){ //Resta el descuento del medio de pago al total de los descuentos (si existen) 
								 //Devuelve el porcentaje total de descuento (si da negativo) o recargo (si da positivo)
		
		float total = -mediopago.getDescuento(); //si el descuento del medio de pago asociado es 20, total va a valer -20
		
		if(this.politicas != null && !(this.politicas.isEmpty())){
			
			for (Politica i : this.politicas) {
				total = total + i.getPorcentaje();
			}
			
		}
		
		return total;
	}
	
	public float calcularPrecioConPorcentaje(float precio){
		
		float total = precio;
		float porcentaje = this.calcularPorcentajeTotal();
		total = total + (porcentaje*total)/100;		
		return total;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((mediopago == null) ? 0 : mediopago.hashCode());
		result = prime * result + id;
		result = prime * result + ((politicas == null) ? 0 : politicas.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CondicionDeVenta other = (CondicionDeVenta) obj;
		if (id != other.id)
			return false;
		if (mediopago == null) {
			if (other.mediopago != null)
				return false;
		} else if (!mediopago.equals(other.mediopago))
			return false;
		if (politicas == null) {
			if (other.politicas != null)
				return false;
		} else if (!politicas.equals(other.politicas))
			return false;
		return true;
	}

	@Override
	public String toString() {	
		if(politicas != null && !politicas.isEmpty())
		
			return "MedioPago [id=" + id + ", mediopago=" + mediopago + ", politicas=" + politicas + "]";
		
		else
			
			return "MedioPago [id=" + id + ", mediopago=" + mediopago + "]";			
	}
	
	public CondicionDeVentaDTO toDTO() {
		CondicionDeVentaDTO dto = new CondicionDeVentaDTO();
		dto.setId(this.id);
		dto.setMediopago(this.mediopago.toDTO());

		List<PoliticaDTO> politicaDTOs = Lists.newLinkedList();
		dto.setPoliticas(politicaDTOs);

		
		for (Politica i : this.politicas) {
			politicaDTOs.add(i.toDTO());
		}

		return dto;
	}
	
}
